// 文件名：array_stack_scratch.cpp
// 目的：演示使用 std::array 在栈上分配固定大小的暂存缓冲（scratch buffer），
//      填充随机数、格式化输出，并求最大值及其索引。
// 要点：
//   - std::array 是静态大小的顺序容器，内存在线程栈上分配，cache 友好；
//   - 使用 <random> 生成 [0,1) 的均匀分布随机数；
//   - 使用 iomanip 控制浮点输出格式（fixed + setprecision）；
//   - 利用 std::max_element 获取最大值与下标（std::distance 计算索引）。
// 注意：
//   - 随机引擎以 steady_clock 时间戳播种，非可重复；需要可复现性可用固定种子；
//   - kScratchSize 为编译期常量，影响数组维度与循环范围。

#include <array>
#include <algorithm>
#include <chrono>
#include <iomanip>
#include <iostream>
#include <random>

constexpr std::size_t kScratchSize = 16;

int main() {
    std::array<double, kScratchSize> scratch{};
    scratch.fill(0.0); // 初始化为 0

    // 使用当前时间播种随机引擎（非确定性）
    std::mt19937 rng(static_cast<unsigned>(
        std::chrono::steady_clock::now().time_since_epoch().count()));
    std::uniform_real_distribution<double> dist(0.0, 1.0);

    // 生成随机数填充缓冲
    std::generate(scratch.begin(), scratch.end(),
                  [&] { return dist(rng); });

    // 打印缓冲区内容（保留 4 位小数）
    std::cout << "Scratch buffer values:\n";
    for (double v : scratch) {
        std::cout << std::fixed << std::setprecision(4) << v << ' ';
    }
    std::cout << "\n";

    // 查找最大值及其索引
    auto maxIt = std::max_element(scratch.begin(), scratch.end());
    std::cout << "Peak value: " << *maxIt
              << " at index " << std::distance(scratch.begin(), maxIt) << '\n';
    return 0;
}